package br.ufrn.engcomp.arq.web;
/**
 * 
 * @author Claudio
 * 
 */
import java.io.Serializable;
import java.util.List; 

import javax.faces.application.Application;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent; 

import br.ufrn.engcomp.arq.dominio.Entidade;
import br.ufrn.engcomp.arq.exceptions.NegocioException;
import br.ufrn.engcomp.arq.exceptions.DAOException;
import br.ufrn.engcomp.arq.negocio.AbstractProcessador;

public abstract class AbstractController<E extends Entidade> implements Serializable { 
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private AbstractProcessador<E> control; 
	private boolean listing = false; 
	private E entidade; 
	private List<E> listEntidade; 

	
	public AbstractController() { 
		control = new AbstractProcessador<E>(); 
		initializeEntity(); 
	} 
	
	protected AbstractProcessador<E> getControl() { 
		return control; 
	} 
	
	protected void setControl(AbstractProcessador<E> control) { 
		this.control = control; 
	} 
	
	public boolean isListing() { 
		return listing; 
	} 
	
	public void setListing(boolean listing) { 
		this.listing = listing; 
	} 
	
	public E getEntidade() { 
		return entidade; 
	} 
	
	public void setEntidade(E entidade) { 
		this.entidade = entidade; 
	} 
	
	public List<E> getListEntidade() { 
		return listEntidade; 
	} 
	
	public void setListEntidade(List<E> listEntidade) {
		this.listEntidade = listEntidade; 
	} 
	

	public void list () { 
		setListing(true); 
		try {
			listEntidade = control.findAll(getEntidade());
		} catch (DAOException e) {
			e.printStackTrace();
		} catch (NegocioException e) {
			e.printStackTrace();
		} 
	} 

	public void saveOrUpdate() {
		try {
			if (entidade.getId() == 0) { 
				control.create(entidade);	
			} else { 
				control.update(entidade); 
			}
		} catch (DAOException e) {
			e.printStackTrace();
		} catch (NegocioException e) {
			e.printStackTrace();
		} 
		initializeEntity(); 
		verifyListing(); 
	} 
	
	public void delete() { 
		try {
			control.delete(entidade);
		} catch (DAOException e) {
			e.printStackTrace();
		} catch (NegocioException e) {
			e.printStackTrace();
		} 
		verifyListing(); 
	} 
		
	private void verifyListing() { 
		if (listing) { 
			try {
				listEntidade = control.findAll(getEntidade());
			} catch (DAOException e) {
				e.printStackTrace();
			} catch (NegocioException e) {
				e.printStackTrace();
			} 
		} 
	} 
	
	public void cancel(ActionEvent event) { 
		initializeEntity(); 
	} 
	
	/**
	 * Realiza um forward para a pagina passada como parametro.
	 */
	public String forward(String url) {
		FacesContext context = FacesContext.getCurrentInstance();
		Application app = context.getApplication();
		UIViewRoot view = app.getViewHandler().createView(context, url);
		context.setViewRoot(view);
		context.renderResponse();

		// Retorna null para evitar o return null no action do Managed Bean
		return null;
	}
	
	protected abstract void initializeEntity(); 
}
